#!/bin/bash

# XY User System 部署问题修复脚本
# 修复原生部署前发现的问题

set -e

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'

log_info() {
    echo -e "${BLUE}[INFO]${NC} $1"
}

log_success() {
    echo -e "${GREEN}[SUCCESS]${NC} $1"
}

log_warning() {
    echo -e "${YELLOW}[WARNING]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

log_info "开始修复部署相关问题..."

# 1. 修复端口配置不一致问题
log_info "修复端口配置..."
if [ -f "src/main.ts" ]; then
    # 将main.ts中的端口改为从环境变量读取
    sed -i.bak 's/const port = 8080;/const port = process.env.PORT || 3000;/' src/main.ts
    log_success "端口配置已修复"
else
    log_error "src/main.ts 文件不存在"
fi

# 2. 修复生产环境数据库配置
log_info "修复数据库配置..."
if [ -f "src/app.module.ts" ]; then
    # 备份原文件
    cp src/app.module.ts src/app.module.ts.bak
    
    # 创建新的app.module.ts内容
    cat > src/app.module.ts << 'EOF'
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { ConfigModule } from '@nestjs/config';
import { TypeOrmModule } from '@nestjs/typeorm';
import { UserModule } from './user/user.module';
import { ProjectModule } from './project/project.module';
import { SubmissionModule } from './submission/submission.module';
import { AuthModule } from './auth/auth.module';
import { FormConfigModule } from './form-config/form-config.module';

@Module({
  imports: [
    ConfigModule.forRoot({
      isGlobal: true,
    }),
    TypeOrmModule.forRoot({
      type: 'mysql',
      host: process.env.DB_HOST || 'localhost',
      port: parseInt(process.env.DB_PORT || '3306', 10),
      username: process.env.DB_USERNAME || 'root',
      password: process.env.DB_PASSWORD || '',
      database: process.env.DB_DATABASE || 'xyuser_db',
      entities: [__dirname + '/**/*.entity{.ts,.js}'],
      synchronize: process.env.NODE_ENV !== 'production', // 生产环境禁用自动同步
      migrations: [__dirname + '/database/migrations/*{.ts,.js}'],
      migrationsRun: process.env.NODE_ENV === 'production', // 生产环境自动运行迁移
      logging: process.env.NODE_ENV !== 'production',
      charset: 'utf8mb4',
      timezone: '+08:00',
    }),
    UserModule,
    ProjectModule,
    SubmissionModule,
    AuthModule,
    FormConfigModule,
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}
EOF
    log_success "数据库配置已修复"
else
    log_error "src/app.module.ts 文件不存在"
fi

# 3. 创建TypeORM配置文件
log_info "创建TypeORM配置文件..."
cat > ormconfig.js << 'EOF'
module.exports = {
  type: 'mysql',
  host: process.env.DB_HOST || 'localhost',
  port: parseInt(process.env.DB_PORT || '3306', 10),
  username: process.env.DB_USERNAME || 'root',
  password: process.env.DB_PASSWORD || '',
  database: process.env.DB_DATABASE || 'xyuser_db',
  entities: ['dist/**/*.entity{.ts,.js}'],
  migrations: ['dist/database/migrations/*{.ts,.js}'],
  cli: {
    migrationsDir: 'src/database/migrations',
  },
  charset: 'utf8mb4',
  timezone: '+08:00',
};
EOF
log_success "TypeORM配置文件已创建"

# 4. 更新package.json添加迁移脚本
log_info "更新package.json..."
if [ -f "package.json" ]; then
    # 备份package.json
    cp package.json package.json.bak
    
    # 使用node脚本更新package.json
    node -e "
    const fs = require('fs');
    const pkg = JSON.parse(fs.readFileSync('package.json', 'utf8'));
    
    // 添加迁移相关脚本
    pkg.scripts['typeorm'] = 'typeorm-ts-node-commonjs';
    pkg.scripts['migration:generate'] = 'npm run typeorm -- migration:generate';
    pkg.scripts['migration:run'] = 'npm run typeorm -- migration:run';
    pkg.scripts['migration:revert'] = 'npm run typeorm -- migration:revert';
    pkg.scripts['schema:sync'] = 'npm run typeorm -- schema:sync';
    
    // 添加缺失的依赖
    if (!pkg.dependencies['@types/qrcode']) {
        pkg.dependencies['@types/qrcode'] = '^1.5.5';
    }
    
    fs.writeFileSync('package.json', JSON.stringify(pkg, null, 2));
    console.log('package.json updated successfully');
    "
    log_success "package.json已更新"
else
    log_error "package.json 文件不存在"
fi

# 5. 创建生产环境启动脚本
log_info "创建生产环境启动脚本..."
cat > start-production.sh << 'EOF'
#!/bin/bash

# 生产环境启动脚本
set -e

# 设置环境变量
export NODE_ENV=production

# 检查环境变量
if [ -z "$DB_PASSWORD" ]; then
    echo "错误: DB_PASSWORD 环境变量未设置"
    exit 1
fi

if [ -z "$JWT_SECRET" ]; then
    echo "错误: JWT_SECRET 环境变量未设置"
    exit 1
fi

# 运行数据库迁移
echo "运行数据库迁移..."
npm run migration:run

# 启动应用
echo "启动应用..."
node dist/main.js
EOF

chmod +x start-production.sh
log_success "生产环境启动脚本已创建"

# 6. 创建数据库初始化脚本
log_info "创建数据库初始化脚本..."
cat > init-database.sql << 'EOF'
-- 创建数据库
CREATE DATABASE IF NOT EXISTS xyuser_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- 创建用户
CREATE USER IF NOT EXISTS 'xyuser'@'localhost' IDENTIFIED BY 'CHANGE_THIS_PASSWORD';
GRANT ALL PRIVILEGES ON xyuser_db.* TO 'xyuser'@'localhost';
FLUSH PRIVILEGES;

-- 使用数据库
USE xyuser_db;

-- 显示当前数据库
SELECT DATABASE() as current_database;
EOF
log_success "数据库初始化脚本已创建"

# 7. 修复deploy-native.sh中的问题
log_info "修复部署脚本..."
if [ -f "deploy-native.sh" ]; then
    # 备份原文件
    cp deploy-native.sh deploy-native.sh.bak
    
    # 修复部署脚本中的问题
    sed -i.tmp 's/npm ci --only=production/npm ci --omit=dev/' deploy-native.sh
    sed -i.tmp 's/sudo -u $APP_USER bash -c "cd $APP_DIR && npm run build"/sudo -u $APP_USER bash -c "cd $APP_DIR && npm run build && npm run migration:run"/' deploy-native.sh
    
    # 清理临时文件
    rm -f deploy-native.sh.tmp
    
    log_success "部署脚本已修复"
else
    log_error "deploy-native.sh 文件不存在"
fi

# 8. 创建环境变量模板
log_info "创建环境变量模板..."
cat > .env.template << 'EOF'
# 应用配置
NODE_ENV=production
PORT=3000

# 数据库配置
DB_HOST=localhost
DB_PORT=3306
DB_USERNAME=xyuser
DB_PASSWORD=your_secure_password_here
DB_DATABASE=xyuser_db

# JWT配置
JWT_SECRET=your_jwt_secret_key_here_please_change_this_in_production
JWT_EXPIRES_IN=7d

# 文件上传配置
UPLOAD_DEST=./public/uploads
MAX_FILE_SIZE=10485760

# CORS配置
CORS_ORIGIN=*

# 日志配置
LOG_LEVEL=info

# 应用基础URL
APP_BASE_URL=https://your-domain.com
EOF
log_success "环境变量模板已创建"

# 9. 创建健康检查脚本
log_info "创建健康检查脚本..."
cat > health-check.sh << 'EOF'
#!/bin/bash

# 健康检查脚本
set -e

HOST=${1:-localhost}
PORT=${2:-3000}
TIMEOUT=${3:-10}

echo "检查应用健康状态: http://$HOST:$PORT/health"

# 检查HTTP响应
if curl -f -s --max-time $TIMEOUT "http://$HOST:$PORT/health" > /dev/null; then
    echo "✅ 应用健康检查通过"
    exit 0
else
    echo "❌ 应用健康检查失败"
    exit 1
fi
EOF

chmod +x health-check.sh
log_success "健康检查脚本已创建"

# 10. 创建部署前检查脚本
log_info "创建部署前检查脚本..."
cat > pre-deploy-check.sh << 'EOF'
#!/bin/bash

# 部署前检查脚本
set -e

echo "🔍 开始部署前检查..."

# 检查Node.js版本
if command -v node >/dev/null 2>&1; then
    NODE_VERSION=$(node -v | cut -d'v' -f2 | cut -d'.' -f1)
    if [ "$NODE_VERSION" -ge 18 ]; then
        echo "✅ Node.js版本检查通过: $(node -v)"
    else
        echo "❌ Node.js版本过低，需要18+，当前: $(node -v)"
        exit 1
    fi
else
    echo "❌ Node.js未安装"
    exit 1
fi

# 检查npm
if command -v npm >/dev/null 2>&1; then
    echo "✅ npm检查通过: $(npm -v)"
else
    echo "❌ npm未安装"
    exit 1
fi

# 检查必要文件
REQUIRED_FILES=(
    "package.json"
    "src/main.ts"
    "src/app.module.ts"
    "deploy-native.sh"
)

for file in "${REQUIRED_FILES[@]}"; do
    if [ -f "$file" ]; then
        echo "✅ 文件检查通过: $file"
    else
        echo "❌ 缺少必要文件: $file"
        exit 1
    fi
done

# 检查依赖
echo "🔍 检查依赖..."
if [ -f "package.json" ]; then
    if npm list --depth=0 >/dev/null 2>&1; then
        echo "✅ 依赖检查通过"
    else
        echo "⚠️  依赖可能有问题，建议运行: npm install"
    fi
fi

# 检查TypeScript编译
echo "🔍 检查TypeScript编译..."
if npm run build >/dev/null 2>&1; then
    echo "✅ TypeScript编译通过"
else
    echo "❌ TypeScript编译失败"
    exit 1
fi

echo "🎉 部署前检查全部通过！"
EOF

chmod +x pre-deploy-check.sh
log_success "部署前检查脚本已创建"

log_success "所有问题修复完成！"

echo ""
echo "📋 修复内容总结:"
echo "1. ✅ 修复了端口配置不一致问题 (main.ts)"
echo "2. ✅ 修复了数据库配置问题 (app.module.ts)"
echo "3. ✅ 创建了TypeORM配置文件 (ormconfig.js)"
echo "4. ✅ 更新了package.json添加迁移脚本"
echo "5. ✅ 创建了生产环境启动脚本 (start-production.sh)"
echo "6. ✅ 创建了数据库初始化脚本 (init-database.sql)"
echo "7. ✅ 修复了部署脚本问题 (deploy-native.sh)"
echo "8. ✅ 创建了环境变量模板 (.env.template)"
echo "9. ✅ 创建了健康检查脚本 (health-check.sh)"
echo "10. ✅ 创建了部署前检查脚本 (pre-deploy-check.sh)"
echo ""
echo "🚀 现在可以安全地进行原生部署了！"
echo ""
echo "📝 下一步操作:"
echo "1. 运行部署前检查: ./pre-deploy-check.sh"
echo "2. 上传代码到服务器"
echo "3. 在服务器上运行: ./deploy-native.sh deploy"